package org.example.iocdemo.controller;

import org.example.iocdemo.repository.User;
import org.example.iocdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {
    public void sayHello() {
        System.out.println("Hello UserController");
        userService.sayHello();
    }

    private UserService userService;

    // 如果只有一个构造方法，不需要加注解
    // 如果有多个构造方法，在没有就加注解的情况下，默认使用无参构造
    // 如果加了注解，就是用加注解的构造方法
    // 不能同时给多个方法加注解
//    @Autowired
//    public UserController() {
//        System.out.println("无参构造UserController");
//        userService = new UserService();
//    }
//    @Autowired
//    public UserController(UserService userService) {
//        System.out.println("有参构造UserController");
//        this.userService = userService;
//    }

    // 当有构造方法时，优先使用构造方法，
    // 如果 set 方法上加了注解， set方法会在构造方法之后执行
    @Autowired
    public void setUserService(UserService userService) {
        System.out.println("set 方法注入");
        this.userService = userService;
    }

    // 当 @Primary 和 @Qualifier 同时存在时，优先 @Qualifier
    // 有 @Resource 时，优先使用 @Resource
    @Resource(name = "user2")
//    @Qualifier("user2")
    @Autowired
    private User user;

    public void sayHi() {
        System.out.println("hi UserController");
        userService.sayHello();
        System.out.println(user);
    }
}
